/* Esta clase provee aritmética finita de t dígitos. */
/* Long double usa 80 bits. */

#ifndef FLOAT_H_
#define FLOAT_H_

#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;

class Float 
{
        public:
                /* Constructor. */
                Float();
                /* Constructor. Recibe la precisión deseada y un valor en double. */
                Float(int precision, long double value);
                /* Destructor. */
                ~Float();
                
                const int 			exponent() 	const;
                const string		mantissa() 	const;
                const int 			precision() const;
                const long double 	value() 	const;
                const long double 	absValue() 	const;
                                
                /* Operadores. */                
                Float operator+ (Float f);
                Float operator- (Float f);
                Float operator/ (Float f);
                Float operator* (Float f);
                Float operator^ (Float f);
                
                /* Asignación. */
                Float & operator= (const Float &);                              
                
        private:                              
                bool 		_isNeg;			/* ¿Es negativo? */
                int 		_exponent;
                int 		_precision;		/* Cantidad de bits. */
                string 		_mantissa;		/* En binario. */
                long double _value;
                
                /* Funciones auxiliares de conversión entre tipos. */
                void 		longDoubleToBinary(long double);
                long double binaryToLongDouble();
};

//~ /* cout. */
//~ ostream& operator<<(ostream& stream, Float& f)
//~ {
	//~ stream << "signo: " << f.sign() << endl;
	//~ stream.precision(20);
	//~ stream << "valor decimal: " << f.value() << endl;
	//~ stream << "exp: " << f.exponent() << endl;
	//~ stream << "mantisa : "  << f.mantissa() << endl;
	//~ return stream;	
//~ }
//~ 
//~ /* Igualdad. */
//~ bool operator==(const Float& a, const Float& b)
//~ {
	//~ return (a.value() == b.value());
//~ }

#endif /*FLOAT_H_*/
